home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Enigma Amiga CD / Listati / 66-Lug-Ago-DIDATTICA-List2.c < prev    next >
C/C++ Source or Header  |  1992-09-02  |  11KB  |  254 lines

  1. /****************************************************************************
  2. * Listato 2                                                                 *
  3. * Apre una finestra e inserisce una serie di gadget d'esempio               *
  4. ****************************************************************************/
  5.  
  6. #define INTUI_V36_NAMES_ONLY
  7.  
  8. /* inclusione file di supporto */
  9. #include <exec/types.h>
  10. #include <exec/memory.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/screens.h>
  13. #include <graphics/gfx.h>
  14. #include <clib/exec_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/graphics_protos.h>
  17. #include <clib/layers_protos.h>
  18. #include <clib/dos_protos.h>
  19.  
  20. struct Library *IntuitionBase = NULL;     /* puntatore a intuition.library */
  21. struct Library *GfxBase = NULL;           /* puntatore a graphics.library */
  22. struct Screen *pubscreen = NULL;          /* puntatore al workbench */
  23. struct Window *finestra = NULL;           /* puntatore alla finestra */
  24. struct MsgPort *UPort;                    /* puntatore alla porta IDCMP */
  25. UBYTE *ChipMem = NULL;                    /* puntatore alla chip ram per le immagini */
  26.  
  27. /* definizione codici identificatori dei gagdets */
  28. #define GADG_1 0
  29. #define GADG_2 1
  30. #define GADG_3 2
  31. #define GADG_4 3
  32. #define GADG_5 4
  33.  
  34. /* utilizza font topaz 8 */
  35. struct TextAttr font = { "topaz",8,FS_NORMAL,FPF_ROMFONT };
  36.  
  37. /* dati per le immagini del gadget */
  38. UWORD imagedata1[] =
  39. {
  40.   0xFFFE,0xC000,0xC000,0xC000,0xC000,0xC000,0xC000,0x8000,
  41.   0x0001,0x0003,0x0003,0x0003,0x0003,0x0003,0x0003,0x7FFF
  42. };
  43.  
  44. UWORD imagedata2[] =
  45. {
  46.   0x0001,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x3FFF,0x7FFF,
  47.   0xFFFE,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0xFFFC,0x8000
  48. };
  49.  
  50. /* immagini per i gadget
  51.    struct Image
  52.    {
  53.      WORD LeftEdge;    posizione dell'immagine relativa all'elemento a cui e' collegata
  54.      WORD TopEdge;
  55.      WORD Width;       grandezza dell'immagine
  56.      WORD Height;
  57.      WORD Depth;
  58.      UWORD *ImageData; puntatore ai dati dell'immagine
  59.      UBYTE PlanePick;  indica su quali bitplanes (bit 0 = bitplane 0, bit 1 = bitplane 1)
  60.                        dello schermo piazzare i bitplane (dove i bit sono a 1) dell'immagine;
  61.                        esempio con immagine a due bitplane:
  62.                        sui primi due bitplane 0x3 (in binario 00000011),
  63.                        sul terzo e quarto 0xC (in binario 00001100)
  64.      UBYTE PlaneOnOff; indica come impostare i bitplanes dello schermo non influenzati
  65.                        dall'immagine (quelli in cui i bit corrispondenti di PlanePick sono a 0;
  66.                        esempi di prima:
  67.                        0xFF, imposta tutti i pixel dei bitplanes non influenzati
  68.                        dall'immagine a 1 (vale a dire 2,3,4,5,6,7 nel primo caso
  69.                        e 0,1,4,5,6,7 nel secondo)
  70.                        0xF0, imposta i pixel dei bitplanes 4-7 che non sono influen-
  71.                        zati dall'immagine con 1 e i pixel dei bitplanes 0-3 non
  72.                         influenzati dall'immagine a 0
  73.      struct Image *NextImage;
  74.    };
  75.    i dati dell'immagine devono essere memorizzati in WORD della memoria chip; se
  76.    il Width dell'immagine non e' allineato a WORD (multiplo di 16) bisogna memoriz-
  77.    zare i dati dell'immagine come se lo fosse approssimando quando occorre per eccesso;
  78.    i dati vengono memorizzati per bitplane partendo da quello piu' basso (0, 1 ecc.)
  79.    E' possibile collegare una serie di immagini in cascata (verranno visualizzate insieme)
  80.    mediante NextImage;
  81. */
  82.  
  83. struct Image PropImm1;
  84. struct Image Imm2 = { 0,0,16,8,2,NULL,0x3,0,NULL };
  85. struct Image Imm1 = { 0,0,16,8,2,NULL,0x3,0,NULL };
  86.  
  87. /* strutture dei bordi per i gadget
  88.    struct Border
  89.    {
  90.      WORD LeftEdge,TopEdge;  posizione del bordo relativa all'elemento collegato
  91.      UBYTE FrontPen,BackPen; penne di scrittura e di sfondo
  92.      UBYTE DrawMode;         modalita' di disegno: JAM1 normale,
  93.                              COMPLEMENT si disegna realizzando il complemento bit
  94.                              a bit dello sfondo
  95.      BYTE Count;             numero di punti della polilinea del bordo
  96.      WORD *XY;               cordinate dei punti della polilinea; es:
  97.                              WORD Linea[] = { x1,y1,x2,y2,x3,y3, ... };
  98.                              Si disegnera' la linea a partire da (x1,y1) per
  99.                              (x2,y2), poi da (x2,y2) a (x3,y3) e cosi' via
  100.      struct Border *NextBorder;
  101.    };
  102.    Piu' bordi possono essere collegati con NextBorder (verranno disegnato insieme)
  103. */
  104. WORD Data4[] = { 201,9,201,-2,200,-1,200,9,-1,9 };
  105. WORD Data3[] = { -2,-2,-2,9,-1,9,-1,-2,201,-2 };
  106. struct Border Bord6 = { 0,0,2,0,JAM1,5,Data4,NULL };
  107. struct Border Bord5 = { 0,0,1,0,JAM1,5,Data3,&Bord6 };
  108.  
  109. WORD Data2[] = { 359,11,359,0,358,1,358,11,1,11 };
  110. WORD Data1[] = { 0,0,0,11,1,11,1,0,359,0 };
  111. struct Border Bord4 = { 0,0,2,0,JAM1,5,Data2,NULL };
  112. struct Border Bord3 = { 0,0,1,0,JAM1,5,Data1,&Bord4 };
  113. struct Border Bord2 = { 0,0,1,0,JAM1,5,Data2,NULL };
  114. struct Border Bord1 = { 0,0,2,0,JAM1,5,Data1,&Bord2 };
  115.  
  116. /* strutture dei gadget
  117.    struttura di IntuiText, per i testi su intuition:
  118.    struct IntuiText
  119.    {
  120.      UBYTE FrontPen,BackPen;  penne di scrittura e di sfondo
  121.      UBYTE DrawMode; JAM1 scrivi il testo ma lascia inalterato lo sfondo
  122.                      JAM2 scrivi il testo e riscrivi lo sfondo con BackPen
  123.                      COMPLEMENT scrivi il testo con il complemento bit a bit con lo sfondo
  124.      WORD LeftEdge,TopEdge;  posizione del testo (angolo in alto a sinistra)
  125.                              relativa all'elemento collegato
  126.      struct TextAttr *ITextFont; font del testo
  127.      UBYTE *IText;  puntatore al testo
  128.      struct IntuiText *NextText;  puntatore alla prossima struttura IntuiText
  129.    }
  130.    Piu' testi possono essere collegati con NextText (verranno visualizzati insieme)
  131. */
  132. char Buffer[101];
  133. struct StringInfo String1 = { Buffer,NULL,0,100,0,0,0,0,0,0,NULL,0,NULL };
  134. struct IntuiText Text5 = { 1,0,JAM2,-150,0,&font,"Inserisci un testo",NULL };
  135. struct Gadget Gad5 = { NULL,160,76,200,12,GFLG_GADGHNONE,
  136.                        GACT_RELVERIFY,GTYP_STRGADGET,(APTR)&Bord5,NULL,
  137.                        &Text5,0,&String1,GADG_5,NULL };
  138. struct PropInfo Prop1 = { AUTOKNOB|FREEHORIZ|PROPNEWLOOK,0,0,MAXBODY/256,MAXBODY,0,0,0,0,0,0 };
  139. struct IntuiText Text4 = { 1,0,JAM2,310,2,&font,"Rosso",NULL };
  140. struct Gadget Gad4 = { &Gad5,10,60,300,12,0,
  141.                        GACT_RELVERIFY,GTYP_PROPGADGET,(APTR)&PropImm1,NULL,
  142.                        &Text4,0,&Prop1,GADG_4,NULL };
  143. struct IntuiText Text3 = { 1,0,JAM2,20,0,&font,"Gadget con immagine e highlight con immagine",NULL };
  144. struct Gadget Gad3 = { &Gad4,10,48,16,8,GFLG_GADGIMAGE|GFLG_GADGHIMAGE|GFLG_GADGHCOMP,
  145.                        GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Imm1,(APTR)&Imm2,
  146.                        &Text3,0,NULL,GADG_3,NULL };
  147. struct IntuiText Text2 = { 1,0,JAM2,4,2,&font,"Gadget con bordo e highlight con bordo",NULL };
  148. struct Gadget Gad2 = { &Gad3,10,34,360,12,GFLG_GADGHIMAGE,
  149.                        GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Bord1,(APTR)&Bord3,
  150.                        &Text2,0,NULL,GADG_2,NULL };
  151. struct IntuiText Text1 = { 1,0,JAM2,4,2,&font,"Gadget con bordo e highlight con complemento",NULL };
  152. struct Gadget Gad1 = { &Gad2,10,20,360,12,GFLG_GADGHCOMP,
  153.                        GACT_RELVERIFY,GTYP_BOOLGADGET,(APTR)&Bord1,NULL,
  154.                        &Text1,0,NULL,GADG_1,NULL };
  155.  
  156. /* definizione prototipi di funzione */
  157. void WaitEvent(struct MsgPort *,struct IntuiMessage *);
  158. void CloseAll(void);
  159. void OpenAll(void);
  160.  
  161. void WaitEvent(struct MsgPort *porta,struct IntuiMessage *mess)
  162. {
  163.   struct IntuiMessage *msg;
  164.  
  165.   while ((msg = (struct IntuiMessage *)GetMsg(porta)) == NULL)
  166.     WaitPort(porta);
  167.  
  168.   CopyMem(msg,mess,sizeof(struct IntuiMessage));
  169.   return;
  170. }
  171.  
  172. /* procedura CloseAll() */
  173. void CloseAll()
  174. {
  175.   if (finestra != NULL) CloseWindow(finestra);
  176.   if (ChipMem != NULL) FreeMem(ChipMem,100);
  177.   if (pubscreen != NULL) UnlockPubScreen(NULL,pubscreen);
  178.   if (GfxBase != NULL) CloseLibrary(GfxBase);
  179.   if (IntuitionBase != NULL) CloseLibrary(IntuitionBase);
  180.  
  181.   exit(0);
  182. }
  183.  
  184. /* procedura OpenAll() */
  185. void OpenAll()
  186. {
  187.   /* apriamo intuition.library, almeno version 36 */
  188.   if ((IntuitionBase = OpenLibrary("intuition.library",36L)) == NULL)
  189.     CloseAll();
  190.  
  191.   /* apriamo graphics.library, almeno version 36; vengono utilizzate delle
  192.      funzioni per il disegno */
  193.   if ((GfxBase = OpenLibrary("graphics.library",36L)) == NULL)
  194.     CloseAll();
  195.  
  196.   /* blocca lo schermo pubblico di default */
  197.   if ((pubscreen = LockPubScreen(NULL)) == NULL)
  198.     CloseAll();
  199.  
  200.   /* allochiamo chip memory per le immagini bitmap dei gadget */
  201.   if ((ChipMem = AllocMem(100,MEMF_CHIP|MEMF_CLEAR|MEMF_PUBLIC)) == NULL)
  202.     CloseAll();
  203.   /* copiamo i dati delle immagini nella chip ram allocata e inseriamo i puntatori
  204.      nei relativi campi di Image */
  205.   CopyMem(imagedata1,ChipMem,32); Imm1.ImageData = (UWORD *)ChipMem;
  206.   CopyMem(imagedata2,ChipMem+32,32); Imm2.ImageData = (UWORD *)(ChipMem+32);
  207.  
  208.   /* scrive il testo di base del gadget stringa */
  209.   strcpy(Buffer,"Testo");
  210.  
  211.   /* apre finestra spostabile, ridimensionabile, SuperBitMap, GimmeZeroZero,
  212.      con il gadget di chiusura */
  213.   if ((finestra = OpenWindowTags(NULL,WA_Left,10,
  214.                                       WA_Top,10,
  215.                                       WA_Width,390,
  216.                                       WA_Height,100,
  217.                                       WA_Title,"Esempi di gadgets",
  218.                                       WA_DragBar,TRUE,
  219.                                       WA_CloseGadget,TRUE,
  220.                                       WA_DepthGadget,TRUE,
  221.                                       WA_Flags,WFLG_NOCAREREFRESH,
  222.                                       WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_GADGETDOWN|IDCMP_GADGETUP,
  223.                                       WA_Gadgets,&Gad1,
  224.                                       WA_PubScreen,pubscreen,
  225.                                       TAG_END)) == NULL)
  226.     CloseAll();
  227.   UPort = finestra -> UserPort;
  228.  
  229.   return;
  230. }
  231.  
  232. void main()
  233. {
  234.   register UWORD GadID;
  235.   struct IntuiMessage mm;
  236.  
  237.   OpenAll();  /* apre tutte le strutture dati */
  238.  
  239.   while(1)
  240.   {
  241.     WaitEvent(UPort,&mm);  /* attende un evento */
  242.     if (mm.Class == IDCMP_CLOSEWINDOW) break; /* se gadget di chiusura esci */
  243.     else if (mm.Class == IDCMP_GADGETDOWN)
  244.     {
  245.       GadID = ((struct Gadget *)(mm.IAddress))->GadgetID;
  246.     }
  247.     else if (mm.Class == IDCMP_GADGETUP)
  248.     {
  249.       GadID = ((struct Gadget *)(mm.IAddress))->GadgetID;
  250.     }
  251.   }
  252.   CloseAll();  /* chiudi tutto ed esci */
  253. }
  254.